<?php 

class ListController extends CommonController{
	
	private $model;

	public function __auto() {
		$this -> model = K('Cate');
	}
	
	public function index(){
		
		//获得顶级分类
		$cateData =$this->model->where("pid=0")->all();
		$this->assign("cateData",$cateData);
//		p($cateData);
		//左侧顶级分类
		$cData =$this -> model->where("pid=0")->all();
		$this->assign("cData",$cData);
		
		//1.要通过cid获得所有的商品gid
    	$cid = Q('get.cid',0,'intval');
		$gids = $this->_cidGetGid($cid);	
		
		//如果有商品的话
		if($gids){
			//2.通过gid找到所有对应商品属性
			$attr = $this->_getAttr($gids);
//			p($attr);
			$this->assign('attr',$attr);
			
			//3.获得筛选的param数组
			//param参数(数组),最后拿到这个数组进行筛选
			//如果param存在，则按照_变成数组,如果不存在用array_fill填充0
			$param = isset($_GET['param']) ? explode('_', $_GET['param']) : array_fill(0, count($attr), 0);
			$this->assign('param',$param);
			//4.进行通过param里面的id，要筛选取交集，获得最终的gid
			$finalGids = $this->_filterGid($param,$gids);
			
		}else{//如果当前分类没有商品的时候，给个空数组为了页面方便判断
		
			$finalGids = array();	
		}
		
		if ($finalGids) {
			//最后得到的商品的gid
			$gid = implode(',', $finalGids);
			//		查找商品表中所有与当前分类有关系的商品
			$screen = M('goods') -> where("gid in ({$gid})") -> all();
//					p($screen);
			$this -> assign('screen', $screen);
		}
		
		
//		p($finalGids);
		//顶级分类->子级
		$SonData =$this -> model->where("pid={$cid}")->limit("4")->all();
		foreach ($SonData as $k => $v) {
			$SonData[$k]['son'] = $this -> model->where("pid={$v['cid']}")->all();
		}
		$this->assign("SonData",$SonData);
//		p($SonData);




//		//商品图片
//		$shopData = K('Shop')->all();
////		p($shopData);
//		$this->assign("shopData",$shopData);
		$this->display();
	}
	
	/**
	 * 通过param获得商品的gid
	 */
	public function _filterGid($param,$gids){
		$temp = array();
		foreach ($param as $gtid) {
			//如果不是‘不限’的时候，进行筛选
			if($gtid){
				$temp[] = M()->join('__goods_attr__ ga1 JOIN __goods_attr__ ga2 ON ga1.gtvalue=ga2.gtvalue')->where('ga1.gtid=' . $gtid)->getField('ga2.goods_gid',true);
			}
		}
//		p($temp);
		//如果不是全部“不限”,也就是点击了 “L” 或者 “红色”
		if($temp){
			//取交集过程
			$first = $temp[0];
			foreach ($temp as $k => $v) {
				//第一步，自己和自己取交集
				//第二步，自己和第二个$v取交集
				//第三步，上次取好的交集和第三个$v取交集
				//array_intersect() 函数返回两个或多个数组的交集数组。结果数组包含了所有在被比较数组中，也同时出现在所有其他参数数组中的值，键名保留不变。
				$first = array_intersect($first, $v);
			}
				//因为filterGids有可能不是当前分类，当前分类找到的gids和filterGids交集
				$finalGids = array_intersect($first, $gids);
				return $finalGids;
		}else{
			//当用户全部点“不限”的时候，也就是默认的时候
			//那么就返回当前的分类查找出来的gid
			return $gids;
		}
	}
	
	
	/**
	 * 通过分类的cid获得对应的所有的商品的gid
	 */
	private function _cidGetGid($cid){
		//1.根据当前分类的cid,获得所有的子集cid
		$catess = K('Cate')->all();
		$sonCids = $this->_getSonCid($catess,$cid);
//		把自己压入
		$sonCids[] = $cid;
//		p($sonCids);
		//2.根据cid获得所有的商品gid
		$gids = K('Shop')->where('cid in(' . implode(',', $sonCids) . ')')->getField('gid',true);
//		p($gids);die;
		return $gids;
	}
	
	/**
	 * 获得当前分类所对应所有的子集cid
	 */
	private function _getSonCid($cateData,$cid){
		$temp = array();
		foreach ($cateData as $cate) {
			if($cate['pid'] == $cid){
				$temp[] = $cate['cid'];
				$temp = array_merge($temp,$this->_getSonCid($cateData, $cate['cid']));
			}
		}
//		p($temp);
		return $temp;
	}
	/**
	 * 通过gids找到商品的属性
	 */
	private function _getAttr($gids){
		$attr = K('Goods_Attr')->where("goods_gid in(" . implode(',', $gids) . ")")->group('gtvalue')->all();
		$attrFirst = array();
		//把相同的类型归结在一起
		foreach ($attr as $v) {
			$attrFirst[$v['taid']][] = $v;
		}
		$attrSecond = array();
		//获得对应的类型属性名称，然后把对应的值也压入
		foreach ($attrFirst as $taid => $value) {
			$attrSecond[] = array(
				'name' => K('Attr')->where('idtype_attr=' . $taid)->getField('name'),
				'value'=> $value
			);
		}
		return $attrSecond;
	}
	
}















 ?>